home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1996 September & October / Amiga-CD 1996 #9-10.iso / demos / storm-c / stormwizard / example-source / c-source / simple / gadgethelp / gadgethelp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-18  |  4.4 KB  |  160 lines

  1. /* Auslesen und anzeigen eines Hilfe-Strings
  2.  
  3.    (geschrieben unter StormC V1.1)
  4.  
  5.    $VER:              1.0 (12.06.96)
  6.  
  7.    Autor:             Thomas Mittelsdorf
  8.  
  9.    © 1996 HAAGE & PARTNER Computer GmbH,  All Rights Reserved
  10.  
  11. */
  12.  
  13. #include    <stdio.h>
  14.  
  15. #include    <clib/alib_protos.h>
  16.  
  17. #include    <pragma/exec_lib.h>
  18. #include    <pragma/intuition_lib.h>
  19. #include    <pragma/utility_lib.h>
  20. #include    <pragma/wizard_lib.h>
  21.  
  22. #include    <libraries/wizard.h>
  23. #include    <intuition/gadgetclass.h>
  24. #include    <intuition/intuition.h>
  25.  
  26. #include    "gadgethelp.h"
  27.  
  28. APTR    surface;
  29. struct Screen    *screen;
  30. struct NewWindow *newwin;
  31. struct Window    *window;
  32. struct WizardWindowHandle *winhandle;
  33. struct Gadget *gads[WINDOW_MAIN_GADGETS];
  34.  
  35. main()
  36. {
  37.     BOOL Flag;
  38.  
  39.     struct IntuiMessage *msg;
  40.  
  41.     APTR    helpiaddress;
  42.     struct WizardWindowHandle *helpwinhandle;
  43.  
  44.     // Erstmal die Oberflächenbeschreibung bereitstellen !
  45.     if ((surface=WZ_OpenSurface("gadgethelp.wizard",0L,TAG_DONE)))
  46.     {
  47.  
  48.         // Natürlich brauchen wir auch einen Screen oder ?
  49.         if ((screen=LockPubScreen(0L)))
  50.         {
  51.  
  52.             // Jetzt holen wir uns ein WindowHandle, mit dem unsere Objekte
  53.             // durch die wizard.library verwaltet werden.
  54.             if ((winhandle=WZ_AllocWindowHandle(screen,0L,surface,TAG_DONE)))
  55.             {
  56.  
  57.                 // Da ein WindowHandle nur Sinn macht, wenn auch die Objekte
  58.                 // darin vorkommen, legen wir diese Objekte jetzt an.
  59.                 if ((newwin=WZ_CreateWindowObj(winhandle,WINDOW_MAIN,WWH_GadgetArray,gads,
  60.                                                                                             WWH_GadgetArraySize,sizeof(gads),
  61.                                                                                             TAG_DONE)))
  62.                 {
  63.  
  64.                     // Nachdem das glatt ging, versuchen wir unser
  65.                     // Fenster zu öffnen. Dabei werden alle Objekte installiert.
  66.                     if ((window=WZ_OpenWindow(winhandle,newwin,WA_AutoAdjust,TRUE,
  67.                                                                             TAG_DONE)))
  68.                     {
  69.                         // Jetzt nur noch dem Betriebssystem mitteilen, das wir
  70.                         // den User unterstützen wollen (in Form des Hilfe !!!).
  71.                         HelpControl(window,HC_GADGETHELP);
  72.  
  73.                         Flag=TRUE;    // Flag zum Beenden der nachfolgenden Schleife
  74.  
  75.                         do
  76.                         {
  77.                             // Da wir keine Rechenzeit verschwenden wollen, werden wir
  78.                             // das Program "schlafen" legen, bis eine Nachricht
  79.                             // eintifft. Für Profis gilt, das auch Wait() verwendet
  80.                             // werden kann.
  81.                             WaitPort(window->UserPort);
  82.  
  83.                             if ((msg=(struct IntuiMessage *)GetMsg(window->UserPort)))
  84.                             {
  85.                                 // Ha, da ist doch tatsächlich eine Nachricht ange-
  86.                                 // kommen. Na dann gucken wir mal ob Sie auch vom
  87.                                 // richtigen Type ist.
  88.  
  89.                                 switch(msg->Class)
  90.                                 {
  91.                                     case IDCMP_CLOSEWINDOW:
  92.                                         {
  93.                                             Flag=FALSE;
  94.                                         }
  95.                                         break;
  96.  
  97.                                     case IDCMP_GADGETHELP:
  98.                                         {
  99.                                             if (msg->IAddress)
  100.                                             {
  101.                                                 SetWindowTitles(window,WZ_GadgetHelp(winhandle,msg->IAddress),(STRPTR)-1L);
  102.                                             }
  103.                                             else
  104.                                                 SetWindowTitles(window,"Außerhalb",(STRPTR)-1L);
  105.                                         }
  106.                                         break;
  107.                                     case IDCMP_MOUSEMOVE:
  108.                                         {
  109.                                             // Leider gibts IDCMP_GADGETHELP`s nur
  110.                                             // ab OS 3.0. Deshalb kann vor OS 3.0
  111.                                             // diese emuliert werden.
  112.  
  113.                                             if (WZ_GadgetHelpMsg(winhandle,&helpwinhandle,&helpiaddress,
  114.                                                                         msg->MouseX,msg->MouseY,NULL))
  115.                                             {
  116.                                                 // So, es liegt also ein neue Msg vor.
  117.  
  118.                                                 if (msg->IAddress)
  119.                                                 {
  120.                                                     SetWindowTitles(window,WZ_GadgetHelp(helpwinhandle,helpiaddress),(STRPTR)-1L);
  121.                                                 }
  122.                                                 else
  123.                                                     SetWindowTitles(window,"Außerhalb",(STRPTR)-1L);
  124.  
  125.                                             }
  126.                                         }
  127.                                         break;
  128.                                 }
  129.  
  130.                                 // Da wir keine Speicherleichen dulden  und
  131.                                 // das Nachrichtensystem nicht durcheinanden bringen
  132.                                 // wollen, teilen wir den Betriebssystem mit, das
  133.                                 // die Nachricht von uns nicht mehr benötigt wird.
  134.                                 ReplyMsg((struct Message *)msg);
  135.                             }
  136.                         }
  137.                         while (Flag);
  138.  
  139.                         // Fenster schließen
  140.                         WZ_CloseWindow(winhandle);
  141.                     }
  142.                 }
  143.  
  144.                 // In jedem Fall muß ein mit WZ_AllocWindowHandle() angelegter
  145.                 // WindowHandle auch wieder freigegeben werden. Übrigens
  146.                 // kann das Fenster hierbei noch offen sein. Probieren Sie es!
  147.                 WZ_FreeWindowHandle(winhandle);
  148.             }
  149.  
  150.             // PublicScreen-Benutzerzähler wieder um eins verringern
  151.             UnlockPubScreen(0L,screen);
  152.         }
  153.  
  154.         // Da wir keine Objekte von dieser Oberfläche mehr besitzen und wir diese
  155.         // auch nicht mehr anlegen, geben wir sie frei. Übrigens noch
  156.         // nicht freigegebene WindowHandles werden hierbei von der
  157.         // wizard.libarry entfernt (Fenster auch geschlossen).
  158.         WZ_CloseSurface(surface);
  159.     }
  160. }